#-*- coding: utf-8 -*-

# 宣告整個模組的全域變數
i = 5
j = 6

'''
注意，該User類別中只有一般流程敘述，沒有任何實體屬性，以及實體方法的定義
'''
class User( object ):
	'''
	注意，因為Python的class也是一種敘述，所以，以下程式碼都是合法的!
	而且，Python的clss敘述，實際上為一種隱性的指派敘述。
	'''
	
	print "I'm user..."
	
	global j, j		# 宣告使用User外部的模組全域變數
	
	if i + j < 10:
		print "global variable: i + j < 10 is true"
	else:
		print "global variable: i + j < 10 is false"
	
	pass
# end of class User

print "\n==================================\n"

def tellMyName( self ):
	result = "My name is " + self.name + ". I'm " + str( self.age ) + "."
	return result


User.doSome = tellMyName	# 動態的在User類別之外，指派一個實體方法給User類別

man = User()
man.name = "Peter"			# 動態的指派man變數兩個實體屬性name與age
man.age  = 55				# name與age屬性只存在man所參照到的User實體上，其他的User實體不存在name與age屬性

who = man.doSome()			# 呼叫實體方法
print who

boy = User()				# boy所參照的User實體並沒有name或age屬性，因此，一定會觸發例外
try:
	boyName = boy.name
	boyAge  = boy.age
except:
	print "The User instance refered by boy variable doesn't have name or age attribute!"


print "\n==================================\n"

def sayMyName( self ):
	result = "Hello, my name is %s. I'm %s years old." % ( self.name, self.age )
	return result
	
bar = User()
bar.doSome = sayMyName		# 小心，這裡是指派sayMayName函式給bar實體的doSome屬性
bar.name   = "Phil Jackson"
bar.age	   = 45

string = bar.doSome( bar )	# 這裡呼叫bar實體的doSome方法時，需要「明確傳入實體」，否則執行錯誤
print string

print "\n==================================\n"

User.name = ""				# 注意，在此時間點，對User類別綁定兩個實體屬性name與age
User.age  = 0				# 在此時間點之後，所有的User實體，就都會繼承到name、age屬性

boyName = boy.name			# 原本的boy變數參考的User實體沒有name或age屬性，現在有了!
boyAge  = boy.age
print "boy name is: " + boyName
print "boy age is: "  + str( boyAge ) + "\n"

# 注意，man與bar變數所參照的User實體，仍然保有自己的實體屬性值，也會呼叫自己擁有的doSome()方法
print man.doSome()			# man的doSome()方法繼承自User類別
print bar.doSome( bar )		# bar的doSome()方法是自行擁有